package com.zxl.designpattern.creator.singleton;

/**
 * @author zxl
 * @version 1.0
 * @description 线程安全的懒汉式单例模式（静态内部类）
 * 当第一次加载 LazyInnerClassSingleton 类时，并不会初始化 instance，
 * 只有在第一次调用 getInstance() 方法时，才会导致 instance 被初始化。
 * 由于 instance 是静态的，因此只会在类加载时初始化一次，并且是线程安全的。
 * 这种方式既保证了线程安全，又保证了懒加载，同时不会影响性能。
 * 因此，这种方式是推荐使用的单例模式实现方式。
 * @date 2025/5/31 18:26
 */
public class LazyInnerClassSingleton {

    private static LazyInnerClassSingleton instance;

    private LazyInnerClassSingleton(){
        // 防止反射破坏单例
        if (LazyHolder.instance != null) {
            throw new RuntimeException("不允许通过反射创建单例实例");
        }
    }

    private void doSomething(){
        System.out.println("do something");
    }

    public static LazyInnerClassSingleton getinstance() {
        return LazyHolder.instance;
    }

    /**
     * 静态内部类
     */
    private static class LazyHolder{
        private static final LazyInnerClassSingleton instance = new LazyInnerClassSingleton();
    }

    /**
     * 防止反序列化
     * 不反序列化时，Java 会先创建一个新的对象实例。
     * 若该对象所属类实现了readResolve()方法，就会调用这个方法。
     * readResolve()方法返回的对象会被直接返回给调用者，而新创建的对象实例则会被丢弃，不会被传递给调用者。
     * 因此，readResolve()方法可以确保反序列化后的对象与序列化前的对象是同一个对象。
     *
     * @return
     */
    public static LazyInnerClassSingleton readResolve(){
        return instance;
    }
}
